#include "http.hpp"
#include <iostream>
#include <unistd.h>

class Task
{
public:
    Task(int clientfd)
        : _clientfd(clientfd)
    {
    }
    void task()
    {
        while (true)
        {
            // 接收报文
            char buffer[1024];
            int n = recv(_clientfd, buffer, sizeof(buffer) - 1, 0);
            if (n <= 0)
            {
                // 客户端退出或读取错误
                close(_clientfd);
                return;
            }
            else
            {
                buffer[n] = '\0';
                std::cout << "Client Request@ \n"
                          << buffer;
                _recvBuffer += buffer;
            }
            // 报文完整性检查，并提取一个完整报文
            // 省略......

            // 解包，这里应该从_recvBuffer中提取单个完整的报文，这里就省略
            _http.Deserilize(_recvBuffer);
            // 业务分发处理（本质填_http._rsp成员）
            // ......
            
            // if(_http._req._uri == errofile) _http.setCode(404);
            // else _http.setCode(200);

            _http.setVersion("HTTP/1.1");
            string file = _http.setText();
            if(file.empty()) 
            {
                _http.setHeader("Location", "/404.html");
                _http.setCode(302);
            }
            //else if......
            else _http.setCode(200);
            _http.setHeader("Content-Length", _http.UriSuffix(file));
            _http.setHeader("Content-Type",to_string(_http._rsp._text.size()));
            
            // 封包
            string out = _http.Serilize();
            _sendBuffer += out;
            // 发送报文
            std::cout << "\n" << "Server Response@ \n" << _sendBuffer << std::endl;
            send(_clientfd, _sendBuffer.c_str(), _sendBuffer.size(), 0);
        }
    }

private:
    Http _http;
    // 发送缓冲区
    string _sendBuffer;
    // 接收缓冲区
    string _recvBuffer;
    int _clientfd;
};